package main

import (
	"fmt"
	"time"
)

// main函数本身也是一个goroutine
func main() {
	for i := 0; i < 1000; i++ {
		go func(i int) {
			for {
				fmt.Printf("Hello from "+
					"goroutine %d\n", i) //io操作会交出控制权
			}
		}(i)
	}
	time.Sleep(time.Minute) //main和goroutine并发执行，main运行完杀掉goroutine来不及打印，所以需要延时
}

// func main() {
// 	var a []int
// 	for i := 0; i < 10; i++ {
// 		go func(i int) {
// 			for {
// 				a[i]++            //协程死循环，不能交出控制权，其他协程等待
// 				runtime.Gosched() //手动交出控制权，一般很少这样用到
// 			}
// 		}(i)
// 	}
// 	time.Sleep(time.Minute) //main方法一直在等待
// }

// func main() {
// 	var a []int
// 	for i := 0; i < 10; i++ {
// 		go func() { //闭包，i为自由变量， race condition!->go run goroutine.go    go run -race goroutine.go查看错误原因
// 			for {
// 				a[i]++            //协程死循环，不能交出控制权，其他协程等待
// 				runtime.Gosched() //手动交出控制权，一般很少这样用到
// 			}
// 		}()
// 	}
// 	time.Sleep(time.Minute) //main方法一直在等待，运行到这里i=10，超出索引
// 	fmt.Println(a)          //a一边读一遍写报错，需要channel处理
// }
